home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / dev / e / bezier.lha / bezier.e < prev    next >
Text File  |  1997-09-30  |  3KB  |  86 lines

  1. OPT PREPROCESS
  2.  
  3.   CONST WIDTH=640, HEIGHT=512, MODE=$29004 -> hires lace
  4. ->CONST WIDTH=640, HEIGHT=256, MODE=$29000 -> hires
  5. ->CONST WIDTH=320, HEIGHT=256, MODE=$21000 -> lowres
  6.  
  7. RAISE    "SCR" IF OpenS()=0,
  8.     "WND" IF OpenW()=0,
  9.     "^C"  IF CtrlC()<>0
  10.  
  11. PROC main() HANDLE
  12.   DEF s,w, p1_x,p1_y, p2_x,p2_y, p3_x,p3_y, p4_x,p4_y
  13.   Rnd(-Shl({arg},5)) -> fairly random ;)
  14.   s:=OpenS(WIDTH,HEIGHT,2,MODE,'Bezier Curves demo')
  15.   w:=OpenW(0,0,WIDTH,HEIGHT,0,$20800,'',s,15,0)
  16.   REPEAT
  17.     p1_x:=Shl(Rnd(WIDTH),16); p1_y:=Shl(Rnd(HEIGHT),16)
  18.     p2_x:=Shl(Rnd(WIDTH),16); p2_y:=Shl(Rnd(HEIGHT),16)
  19.     p3_x:=Shl(Rnd(WIDTH),16); p3_y:=Shl(Rnd(HEIGHT),16)
  20.     p4_x:=Shl(Rnd(WIDTH),16); p4_y:=Shl(Rnd(HEIGHT),16) ->(16,16) fixed point
  21.     Move(stdrast,0,0); ClearScreen(stdrast)
  22.  
  23.     Line(Shr(p1_x,16),Shr(p1_y,16),Shr(p4_x,16),Shr(p4_y,16),2) -> P1 to P4
  24.     Line(Shr(p1_x,16),Shr(p1_y,16),Shr(p2_x,16),Shr(p2_y,16),2) -> P1 to P2
  25.     Line(Shr(p4_x,16),Shr(p4_y,16),Shr(p3_x,16),Shr(p3_y,16),2) -> P4 to P3
  26.     SetAPen(stdrast,1)
  27.     bezier(p1_x,p1_y, p2_x,p2_y, p3_x,p3_y, p4_x,p4_y)
  28.     Delay(80)
  29.   UNTIL CtrlC()
  30.   Raise(0)
  31. EXCEPT
  32.   IF w THEN CloseW(w)
  33.   IF s THEN CloseS(s)
  34. ENDPROC
  35.  
  36. #define AVG(x,y) Shr(x+y,1)
  37. PROC bezier(p1_x,p1_y, p2_x,p2_y, p3_x,p3_y, p4_x,p4_y, level=0)
  38.   -> with thanks to Storm/Cydonia
  39.  
  40.   -> All  we  do  is  divide the curve into two seperate curves, and repeat
  41.   -> this division until we have many curves (here we have 2^11 at maximum)
  42.   -> in  which  case we have enough accuracy to get away with drawing these
  43.   -> tiny curves as points.
  44.  
  45.   -> P1  is  the start point of the curve (or curve segment). P4 is the end
  46.   -> point. P2 and P3 are the control points of it. We divide the 'P' curve
  47.   -> into  two  curves,  the  'L'  curve  (L1/L2/L3/L4)  and  the 'R' curve
  48.   -> (R1/R2/R3/R4).  The  L curve goes from the start point to the midpoint
  49.   -> of the P curve. The R curve goes from the midpoint to the end point of
  50.   -> the P curve.
  51.  
  52.   DEF l1_x,l1_y, l2_x,l2_y, l3_x,l3_y, l4_x,l4_y,
  53.       r1_x,r1_y, r2_x,r2_y, r3_x,r3_y, r4_x,r4_y,
  54.       h_x,h_y
  55.  
  56.   IF level<11
  57.     l1_x:=p1_x             -> L1 = P1
  58.     l1_y:=p1_y
  59.     r4_x:=p4_x             -> R4 = P4
  60.     r4_y:=p4_y
  61.  
  62.     l2_x:=AVG(p1_x, p2_x)  -> L2 = average(P1, P2)
  63.     l2_y:=AVG(p1_y, p2_y)
  64.     r3_x:=AVG(p3_x, p4_x)  -> R3 = average(P3, P4)
  65.     r3_y:=AVG(p3_y, p4_y)
  66.  
  67.     h_x:=AVG(p2_x, p3_x)   -> H = average(P2, P3)
  68.     h_y:=AVG(p2_y, p3_y)
  69.  
  70.     l3_x:=AVG(l2_x, h_x)   -> L3 = average(L2, H)
  71.     l3_y:=AVG(l2_y, h_y)
  72.     r2_x:=AVG(r3_x, h_x)   -> R2 = average(R3, H)
  73.     r2_y:=AVG(r3_y, h_y)
  74.  
  75.     l4_x:=AVG(l3_x, r2_x)  -> L4 = average(L3, R2)
  76.     l4_y:=AVG(l3_y, r2_y)
  77.     r1_x:=l4_x             -> R1 = L4
  78.     r1_y:=l4_y
  79.  
  80.     bezier(l1_x,l1_y, l2_x,l2_y, l3_x,l3_y, l4_x,l4_y, level+1) -> left
  81.     bezier(r1_x,r1_y, r2_x,r2_y, r3_x,r3_y, r4_x,r4_y, level+1) -> right
  82.   ELSE
  83.     WritePixel(stdrast,Shr(p1_x,16),Shr(p1_y,16))
  84.   ENDIF
  85. ENDPROC
  86.